package Fly.example.controller;


import Fly.example.common.R;
import Fly.example.pojo.Orders;
import Fly.example.pojo.User;
import Fly.example.service.IUserService;
import Fly.example.utils.ValidateCodeUtils;
import com.alibaba.druid.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 * 用户信息 前端控制器
 * </p>
 *
 * @author 陽Fly
 * @since 2025-06-17
 */
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @Autowired
    private IUserService userService;
    @Autowired
    private RedisTemplate redisTemplate;

    @PostMapping("/sendMsg")
    public R<String> sendMsg(@RequestBody User user, HttpSession session) {
        //获取手机号
        log.info("发送验证码业务开始…………");
        log.info("手机号为：" + user.getPhone());
        String phone = user.getPhone();
        if (!StringUtils.isEmpty(phone)) {
            //生成随机的四位验证码
            String code = ValidateCodeUtils.generateValidateCode(4).toString();
            //老师是使用阿里云提供的短信服务api来发送验证码，而我们这里直接输出到控制台
            log.info("瑞吉外卖的验证码为：" + code + ",验证码的有效期为1分钟");
            //需要将生成的验证码保存到Session
//            session.setAttribute(phone, code);

            //优化
            //将验证码缓存到redis中，并且设置有效的时间为1分钟
            redisTemplate.opsForValue().set(phone, code,1, TimeUnit.MINUTES);

            R.success("手机验证码发送成功");

        }

        return R.error("手机验证码发送失败");
    }

    /*
    * 移动端用户登录
    * */
    @PostMapping("/login")
    public R<User> login(@RequestBody Map user, HttpSession session) {
        //获取手机号和验证码
        String phone = user.get("phone").toString();
        String code = (String) user.get("code");
        log.info("获取到的信息为：手机号：{},验证码：{},对于该操作进行验证",phone,code);
        //从session里面获取验证码
//        String attribute = session.getAttribute(phone).toString();

        //优化
        //从redis中获取验证码
        String attribute = redisTemplate.opsForValue().get(phone).toString();

        //进行验证码比对
        if (!StringUtils.isEmpty(attribute) && attribute.equals(code)) {
            //比对成功，就登录成功
            //判断当前手机号是否是第一次登录，如果是就是新用户，需要把当前手机号保存到user表
            LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<User>();
            queryWrapper.eq(User::getPhone, phone);
            User one = userService.getOne(queryWrapper);
            if (one == null) {
                //进来了表明是一个新用户
                one = new User();
                one.setPhone(phone);
                //状态设不设置都可以
                one.setStatus(1);
                userService.save(one);
                R.success(one);
            }
            //登录成功后将id保存到session里面
            session.setAttribute("user", one.getId());

            //优化
            //如果用户登录成功就删除验证码
            redisTemplate.delete(phone);

            return R.success(one);
        }

        return R.error("登录失败，验证码错误");
    }

    //退出登录业务
    @PostMapping("/loginout")
    public R<String> loginout(HttpServletRequest request){
        log.info("退出登录业务开始…………");
        request.getSession().removeAttribute("user");
        return R.success("退出登录成功");
    }
}
